package com.spc.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.spc.constant.RedisConstant;
import com.spc.dao.MemberDao;
import com.spc.entity.PageResult;
import com.spc.entity.QueryPageBean;
import com.spc.pojo.Member;
import com.spc.service.MemberService;
import com.spc.utils.MD5Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/*
用户相关sercice实现类
* */
@Service(interfaceClass = MemberService.class)
@Transactional
public class MemberServiceImpl implements MemberService {
    @Autowired
    private MemberDao memberDao;
    // 自动注入jedispool
    @Autowired
    private JedisPool jedisPool;

    @Override
    public Member findByTelephone(String telephone) {
        Member member = memberDao.findByTelephone(telephone);
        return member;

    }

    @Override
    public void add(Member member) {
        String password = member.getPassword();
        if (password != null){
            //不为空加密密码
            password = MD5Utils.md5(password);
            member.setPassword(password);
        }
        memberDao.add(member);
        //  判断member的filenumber是否为空,如果不为空,则将该档案号添加进t_filenumber表
        String fileNumber = member.getFileNumber();
        if (fileNumber!=null&&!fileNumber.equals("")){
            memberDao.addFileNumber(member.getFileNumber());
        }
    }

    @Override
    public List<Integer> findMemberCountByMonths(List<String> months) {
        ArrayList<Integer> memberCount = new ArrayList<Integer>();
        for (String month : months) {
            String date = month+".31";
            Integer count = memberDao.findMemberCountBeforeDate(date);
            memberCount.add(count);
        }

        return memberCount;
    }

    /*
   通过月份查询该月末为止的会员预约数量,用于会员预约折现统计图
       调用dao时,需要将请求参数在此月份基础上加上日为31
   * */
    @Override
    public Map<String, Object> getMemberOrderByMonths(ArrayList<String> months) {
        // 1,创建一个Integer类型的list集合,用于存储当月截止的会员预约数
        ArrayList<Integer> memberOrderCount = new ArrayList<>();
        // 1,创建一个Integer类型的list集合,用于存储当月截止的会员预约数且已到诊
        ArrayList<Integer> memberOrderCountFinished = new ArrayList<>();
        // 2.遍历该months集合
        for (String month : months) {
            // 2.1 调用memberDao中的findMemberOrderCountByBeforeMonth方法,参数为month_31
            // 查询得到该日期前的所有会员预约数
            //在该month的基础上,加上日为31(每月最大为31)
            String month_31 = month+"-31";
            Integer memberOrder = memberDao.findMemberOrderCountByBeforeMonth(month_31);
            // 2.2 调用memberDao中的findMemberOrderCountByBeforeMonthFinished方法,参数为month_31
            // 查询得到该日期前的所有会员预约数并且已到诊
            Integer memberOrderFinished = memberDao.findMemberOrderCountByBeforeMonthFinished(month_31);
            // 2.3 将得到的数存入对应的list集合
            memberOrderCount.add(memberOrder);
            memberOrderCountFinished.add(memberOrderFinished);
        }
        // 3.创建一个map集合,存储这两个list集合
        Map<String, Object> map = new HashMap<>();
        map.put("memberOrderCount",memberOrderCount);
        map.put("memberOrderCountFinished",memberOrderCountFinished);
        // 3. 返回该map集合
        return map;
    }

    /*
    会员预约柱状图显示
    通过当前日期,查询本月会员预约量
    * */
    @Override
    public Map<String,Object> getMemberOrderByDays(ArrayList<String> days) {
        // 1,创建一个Integer类型的list集合,用于存储本月预约会员且已到诊会员数
        ArrayList<Integer> memberOrderCount = new ArrayList<>();
        // 1.1 在常见一个orderAlreadTotal,用于存储当月目前为止预约且已到诊数
        int orderAlreadTotal = 0;
        // 2.遍历该days集合
        for (String day : days) {
            // 2.2 调用memberDao中的findMemberOrderOfMonth方法,参数为day
            // 查询得到该日期的预约且已到诊数
            Integer count = memberDao.findMemberOrderOfMonth(day);
            // 将count添加到orderAlreadTotal中
            orderAlreadTotal+=count;
            // 2.4 将得到的数存入memberOrderCount集合
            memberOrderCount.add(count);
        }
        // 4. 创建一个map集合,键为string类型.值为object类型
       Map<String, Object> map = new HashMap<>();
        //5.将该memberOrderCount集合加入map中,键名为memberOrderCount(与html页面总的折线图纵坐标名相同)
           map.put("memberOrderCount", memberOrderCount);
           // 5.1 再将orderAlreadTotal放入map中
        map.put("orderAlreadTotal","本月已到诊会员: "+orderAlreadTotal+"人");
        // 3. 遍历完以后返回该memberOrderCount集合
        return map;
    }


    /*
   分页查询检查项
   * */
    @Override
    public PageResult queryPage(QueryPageBean queryPageBean)  {
        // 1.获取queryPageBean中的每个数据
        Integer currentPage = queryPageBean.getCurrentPage();
        Integer pageSize = queryPageBean.getPageSize();
        String queryString = queryPageBean.getQueryString();
        // 2.调用分页助手的startPage方法,将currentPage和pageSize作为参数,会自动对查询的数据进行分页
        PageHelper.startPage(currentPage,pageSize);
        //3.调用memberDao中的findbyqueryString方法,参数为queryString,得到查询结果为Page封装的checkitem对象数据
        // (该page类型为分页助手提供)
        Page<Member> pages = memberDao.findMemberByQueryString(queryString);
        // 4.在通过page对象中的getTotal方法,得到总页数total
        long total = pages.getTotal();
        // 5.在通过page对象中的getresult方法,得到该页的数据rows
        List<Member> rows = pages.getResult();
        // 6.最后返回一个pageresult对象,并且将total和rows最为形参
        return new PageResult(total,rows);
    }

    /*
    根据会员id,删除该会员档案
    * */
    @Override
    public void delete(Integer[] deleteIds) {
        // 1.遍历数组,根据id值查询会员信息封装到member中
        if (deleteIds!=null&&deleteIds.length>0){
            for (Integer deleteId : deleteIds) {
                Member member = memberDao.findMemberById(deleteId);
                // 1.1 判断member的filenumber是否为空,如果不为空则删除t_filenumber表相关信息
                String fileNumber = member.getFileNumber();
                if (fileNumber!=null&&!fileNumber.equals("")){
                    // 1.2 调用dao中的deleteFileNumber,删除filenumber表信息
                    memberDao.deleteFileNumber(fileNumber);
                }

            }
        }
        // 1. 调用dao中的deleteById方法,参数为deleteIds数组,删除id数组中会员档案
        memberDao.deleteByIds(deleteIds);

    }

    /*
    根据会员id,查询该会员信息
        (用于编辑用户时回显数据)
    * */
    @Override
    public Member findMemberById(Integer id) {
        // 1.调用dao中的findMemberById方法,查询得到指定id的数据,并封装为member对象
        Member member = memberDao.findMemberById(id);
        // 2.返回该checkItem对象
        return member;
    }

    /*
    编辑该会员信息
    * */
    @Override
    public void edit(Member member) {
        // 1.调用dao中的edit方法,修改该id的检查项数据
        memberDao.edit(member);
    }

    /*
    分页展示会员体检报告上传信息
    * */
    @Override
    public PageResult queryPageMemberReport(QueryPageBean queryPageBean) {
        // 1.获取queryPageBean中的每个数据
        Integer currentPage = queryPageBean.getCurrentPage();
        Integer pageSize = queryPageBean.getPageSize();
        String queryString = queryPageBean.getQueryString();
        // 2.调用分页助手的startPage方法,将currentPage和pageSize作为参数,会自动对查询的数据进行分页
        PageHelper.startPage(currentPage,pageSize);
        //3.调用memberDao中的findbyqueryString方法,参数为queryString,得到查询结果为Page封装的checkitem对象数据
        // (该page类型为分页助手提供)
        Page<Map> pages = memberDao.findMemberReportByQueryString(queryString);
        // 4.在通过page对象中的getTotal方法,得到总页数total
        long total = pages.getTotal();
        // 5.在通过page对象中的getresult方法,得到该页的数据rows
        List<Map> rows = pages.getResult();
        // 6.最后返回一个pageresult对象,并且将total和rows最为形参
        return new PageResult(total,rows);
    }

    /*
    保存会员体检报告上传
    * */
    @Override
    public void saveMemberUpload(Map map) {
        // 1.调用dao中的addSetmeal方法,参数为setmeal对象
        memberDao.saveMemberUpload(map);
        // 2.获取map中pdf的名称
        String reportPdf = (String) map.get("reportPdf");
        // 3. 添加成功后,在将filenumber表中的reportPdf添加到redis中的memberPdfDbResources集合中
        jedisPool.getResource().sadd(RedisConstant.MEMBER_PDF_DB_RESOURCES, reportPdf);
    }

    /*
    删除体检报告
        参数中的数组存储的是需要删除的"报告名称"
    * */
    @Override
    public void deleteRepert(String[] deleteReportPdfs) {
        // 1.调用dao中的deleteRepert方法,参数为deleteids数组
        memberDao.deleteRepert(deleteReportPdfs);
        // 2.删除成功后,遍历该集合,将其在redis中的值删除
        if (deleteReportPdfs!=null&&deleteReportPdfs.length>0){
            for (String deleteReportPdf : deleteReportPdfs) {
                // 3.在将redis中memberPdfResources和memberPdfDbResources中对应的pdf的名称删除
                Jedis jedis = jedisPool.getResource();
                jedis.srem(RedisConstant.MEMBER_PDF_RESOURCES,deleteReportPdf);
                jedis.srem(RedisConstant.MEMBER_PDF_DB_RESOURCES,deleteReportPdf);
            }
        }
    }
}
